package lunadevs.luna.devschangelog;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;

import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiPageButtonList;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.util.ChatAllowedCharacters;
import net.minecraft.util.MathHelper;

public class GuiBuild2Field extends Gui 
{
	private final int field_175208_g;
 private final FontRenderer fontRendererInstance;
 public int xPosition;
 public int yPosition;

 /** The width of this text field. */
 private final int width;
 private final int height;

 /** Has the current text being edited on the textbox. */
 private String text = "";
 private int maxStringLength = 32;
 private int cursorCounter;
 private boolean enableBackgroundDrawing = true;

 /**
  * if true the textbox can lose focus by clicking elsewhere on the screen
  */
 private boolean canLoseFocus = true;

 /**
  * If this value is true along with isEnabled, keyTyped will process the keys.
  */
 private boolean isFocused;

 /**
  * If this value is true along with isFocused, keyTyped will process the keys.
  */
 private boolean isEnabled = true;

 /**
  * The current character index that should be used as start of the rendered text.
  */
 private int lineScrollOffset;
 private int cursorPosition;

 /** other selection position, maybe the same as the cursor */
 private int selectionEnd;
 private int enabledColor = 14737632;
 private int disabledColor = 7368816;

 /** True if this textbox is visible */
 private boolean visible = true;
 private GuiPageButtonList.GuiResponder field_175210_x;
 private Predicate field_175209_y = Predicates.alwaysTrue();
 private static final String __OBFID = "CL_00000670";

 public GuiBuild2Field(int p_i45542_1_, FontRenderer p_i45542_2_, int p_i45542_3_, int p_i45542_4_, int p_i45542_5_, int p_i45542_6_)
 {
     this.field_175208_g = p_i45542_1_;
     this.fontRendererInstance = p_i45542_2_;
     this.xPosition = p_i45542_3_;
     this.yPosition = p_i45542_4_;
     this.width = p_i45542_5_;
     this.height = p_i45542_6_;
 }

 public void func_175207_a(GuiPageButtonList.GuiResponder p_175207_1_)
 {
     this.field_175210_x = p_175207_1_;
 }

 /**
  * Increments the cursor counter
  */
 public void updateCursorCounter()
 {
     ++this.cursorCounter;
 }

 /**
  * Sets the text of the textbox
  */
 public void setText(String p_146180_1_)
 {
     if (this.field_175209_y.apply(p_146180_1_))
     {
         if (p_146180_1_.length() > this.maxStringLength)
         {
             this.text = p_146180_1_.substring(0, this.maxStringLength);
         }
         else
         {
             this.text = p_146180_1_;
         }

         this.setCursorPositionEnd();
     }
 }

 /**
  * Returns the contents of the textbox
  */
 public String getText()
 {
     return this.text;
 }

 /**
  * returns the text between the cursor and selectionEnd
  */
 public String getSelectedText()
 {
     int var1 = this.cursorPosition < this.selectionEnd ? this.cursorPosition : this.selectionEnd;
     int var2 = this.cursorPosition < this.selectionEnd ? this.selectionEnd : this.cursorPosition;
     return this.text.substring(var1, var2);
 }

 public void func_175205_a(Predicate p_175205_1_)
 {
     this.field_175209_y = p_175205_1_;
 }

 /**
  * replaces selected text, or inserts text at the position on the cursor
  */
 public void writeText(String p_146191_1_)
 {
     String var2 = "";
     String var3 = ChatAllowedCharacters.filterAllowedCharacters(p_146191_1_);
     int var4 = this.cursorPosition < this.selectionEnd ? this.cursorPosition : this.selectionEnd;
     int var5 = this.cursorPosition < this.selectionEnd ? this.selectionEnd : this.cursorPosition;
     int var6 = this.maxStringLength - this.text.length() - (var4 - var5);
     boolean var7 = false;

     if (this.text.length() > 0)
     {
         var2 = var2 + this.text.substring(0, var4);
     }

     int var8;

     if (var6 < var3.length())
     {
         var2 = var2 + var3.substring(0, var6);
         var8 = var6;
     }
     else
     {
         var2 = var2 + var3;
         var8 = var3.length();
     }

     if (this.text.length() > 0 && var5 < this.text.length())
     {
         var2 = var2 + this.text.substring(var5);
     }

     if (this.field_175209_y.apply(var2))
     {
         this.text = var2;
         this.moveCursorBy(var4 - this.selectionEnd + var8);

         if (this.field_175210_x != null)
         {
             this.field_175210_x.func_175319_a(this.field_175208_g, this.text);
         }
     }
 }

 /**
  * Deletes the specified number of words starting at the cursor position. Negative numbers will delete words left of
  * the cursor.
  */
 public void deleteWords(int p_146177_1_)
 {
     if (this.text.length() != 0)
     {
         if (this.selectionEnd != this.cursorPosition)
         {
             this.writeText("");
         }
         else
         {
             this.deleteFromCursor(this.getNthWordFromCursor(p_146177_1_) - this.cursorPosition);
         }
     }
 }

 /**
  * delete the selected text, otherwsie deletes characters from either side of the cursor. params: delete num
  */
 public void deleteFromCursor(int p_146175_1_)
 {
     if (this.text.length() != 0)
     {
         if (this.selectionEnd != this.cursorPosition)
         {
             this.writeText("");
         }
         else
         {
             boolean var2 = p_146175_1_ < 0;
             int var3 = var2 ? this.cursorPosition + p_146175_1_ : this.cursorPosition;
             int var4 = var2 ? this.cursorPosition : this.cursorPosition + p_146175_1_;
             String var5 = "";

             if (var3 >= 0)
             {
                 var5 = this.text.substring(0, var3);
             }

             if (var4 < this.text.length())
             {
                 var5 = var5 + this.text.substring(var4);
             }

             this.text = var5;

             if (var2)
             {
                 this.moveCursorBy(p_146175_1_);
             }

             if (this.field_175210_x != null)
             {
                 this.field_175210_x.func_175319_a(this.field_175208_g, this.text);
             }
         }
     }
 }

 public int func_175206_d()
 {
     return this.field_175208_g;
 }

 /**
  * see @getNthNextWordFromPos() params: N, position
  */
 public int getNthWordFromCursor(int p_146187_1_)
 {
     return this.getNthWordFromPos(p_146187_1_, this.getCursorPosition());
 }

 /**
  * gets the position of the nth word. N may be negative, then it looks backwards. params: N, position
  */
 public int getNthWordFromPos(int p_146183_1_, int p_146183_2_)
 {
     return this.func_146197_a(p_146183_1_, p_146183_2_, true);
 }

 public int func_146197_a(int p_146197_1_, int p_146197_2_, boolean p_146197_3_)
 {
     int var4 = p_146197_2_;
     boolean var5 = p_146197_1_ < 0;
     int var6 = Math.abs(p_146197_1_);

     for (int var7 = 0; var7 < var6; ++var7)
     {
         if (var5)
         {
             while (p_146197_3_ && var4 > 0 && this.text.charAt(var4 - 1) == 32)
             {
                 --var4;
             }

             while (var4 > 0 && this.text.charAt(var4 - 1) != 32)
             {
                 --var4;
             }
         }
         else
         {
             int var8 = this.text.length();
             var4 = this.text.indexOf(32, var4);

             if (var4 == -1)
             {
                 var4 = var8;
             }
             else
             {
                 while (p_146197_3_ && var4 < var8 && this.text.charAt(var4) == 32)
                 {
                     ++var4;
                 }
             }
         }
     }

     return var4;
 }

 /**
  * Moves the text cursor by a specified number of characters and clears the selection
  */
 public void moveCursorBy(int p_146182_1_)
 {
     this.setCursorPosition(this.selectionEnd + p_146182_1_);
 }

 /**
  * sets the position of the cursor to the provided index
  */
 public void setCursorPosition(int p_146190_1_)
 {
     this.cursorPosition = p_146190_1_;
     int var2 = this.text.length();
     this.cursorPosition = MathHelper.clamp_int(this.cursorPosition, 0, var2);
     this.setSelectionPos(this.cursorPosition);
 }

 /**
  * sets the cursors position to the beginning
  */
 public void setCursorPositionZero()
 {
     this.setCursorPosition(0);
 }

 /**
  * sets the cursors position to after the text
  */
 public void setCursorPositionEnd()
 {
     this.setCursorPosition(this.text.length());
 }

 /**
  * Call this method from your GuiScreen to process the keys into the textbox
  */
 public boolean textboxKeyTyped(char p_146201_1_, int p_146201_2_)
 {
     if (!this.isFocused)
     {
         return false;
     }
     else if (GuiScreen.func_175278_g(p_146201_2_))
     {
         this.setCursorPositionEnd();
         this.setSelectionPos(0);
         return true;
     }
     else if (GuiScreen.func_175280_f(p_146201_2_))
     {
         GuiScreen.setClipboardString(this.getSelectedText());
         return true;
     }
     else if (GuiScreen.func_175279_e(p_146201_2_))
     {
         if (this.isEnabled)
         {
             this.writeText(GuiScreen.getClipboardString());
         }

         return true;
     }
     else if (GuiScreen.func_175277_d(p_146201_2_))
     {
         GuiScreen.setClipboardString(this.getSelectedText());

         if (this.isEnabled)
         {
             this.writeText("");
         }

         return true;
     }
     else
     {
         switch (p_146201_2_)
         {
             case 14:
                 if (GuiScreen.isCtrlKeyDown())
                 {
                     if (this.isEnabled)
                     {
                         this.deleteWords(-1);
                     }
                 }
                 else if (this.isEnabled)
                 {
                     this.deleteFromCursor(-1);
                 }

                 return true;

             case 199:
                 if (GuiScreen.isShiftKeyDown())
                 {
                     this.setSelectionPos(0);
                 }
                 else
                 {
                     this.setCursorPositionZero();
                 }

                 return true;

             case 203:
                 if (GuiScreen.isShiftKeyDown())
                 {
                     if (GuiScreen.isCtrlKeyDown())
                     {
                         this.setSelectionPos(this.getNthWordFromPos(-1, this.getSelectionEnd()));
                     }
                     else
                     {
                         this.setSelectionPos(this.getSelectionEnd() - 1);
                     }
                 }
                 else if (GuiScreen.isCtrlKeyDown())
                 {
                     this.setCursorPosition(this.getNthWordFromCursor(-1));
                 }
                 else
                 {
                     this.moveCursorBy(-1);
                 }

                 return true;

             case 205:
                 if (GuiScreen.isShiftKeyDown())
                 {
                     if (GuiScreen.isCtrlKeyDown())
                     {
                         this.setSelectionPos(this.getNthWordFromPos(1, this.getSelectionEnd()));
                     }
                     else
                     {
                         this.setSelectionPos(this.getSelectionEnd() + 1);
                     }
                 }
                 else if (GuiScreen.isCtrlKeyDown())
                 {
                     this.setCursorPosition(this.getNthWordFromCursor(1));
                 }
                 else
                 {
                     this.moveCursorBy(1);
                 }

                 return true;

             case 207:
                 if (GuiScreen.isShiftKeyDown())
                 {
                     this.setSelectionPos(this.text.length());
                 }
                 else
                 {
                     this.setCursorPositionEnd();
                 }

                 return true;

             case 211:
                 if (GuiScreen.isCtrlKeyDown())
                 {
                     if (this.isEnabled)
                     {
                         this.deleteWords(1);
                     }
                 }
                 else if (this.isEnabled)
                 {
                     this.deleteFromCursor(1);
                 }

                 return true;

             default:
                 if (ChatAllowedCharacters.isAllowedCharacter(p_146201_1_))
                 {
                     if (this.isEnabled)
                     {
                         this.writeText(Character.toString(p_146201_1_));
                     }

                     return true;
                 }
                 else
                 {
                     return false;
                 }
         }
     }
 }

 /**
  * Args: x, y, buttonClicked
  */
 public void mouseClicked(int p_146192_1_, int p_146192_2_, int p_146192_3_)
 {
     boolean var4 = p_146192_1_ >= this.xPosition && p_146192_1_ < this.xPosition + this.width && p_146192_2_ >= this.yPosition && p_146192_2_ < this.yPosition + this.height;

     if (this.canLoseFocus)
     {
         this.setFocused(var4);
     }

     if (this.isFocused && var4 && p_146192_3_ == 0)
     {
         int var5 = p_146192_1_ - this.xPosition;

         if (this.enableBackgroundDrawing)
         {
             var5 -= 4;
         }

         String var6 = this.fontRendererInstance.trimStringToWidth(this.text.substring(this.lineScrollOffset), this.getWidth());
         this.setCursorPosition(this.fontRendererInstance.trimStringToWidth(var6, var5).length() + this.lineScrollOffset);
     }
 }

 /**
  * Draws the textbox
  */
 public void drawTextBox()
 {
     if (this.getVisible())
     {
         if (this.getEnableBackgroundDrawing())
         {
             drawRect(this.xPosition - 1, this.yPosition - 1, this.xPosition + this.width + 1, this.yPosition + this.height + 1, -6250336);
             drawRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, -16777216);
         }

         int var1 = this.isEnabled ? this.enabledColor : this.disabledColor;
         int var2 = this.cursorPosition - this.lineScrollOffset;
         int var3 = this.selectionEnd - this.lineScrollOffset;
         String var4 = this.fontRendererInstance.trimStringToWidth(this.text.substring(this.lineScrollOffset), this.getWidth());
         boolean var5 = var2 >= 0 && var2 <= var4.length();
         boolean var6 = this.isFocused && this.cursorCounter / 6 % 2 == 0 && var5;
         int var7 = this.enableBackgroundDrawing ? this.xPosition + 4 : this.xPosition;
         int var8 = this.enableBackgroundDrawing ? this.yPosition + (this.height - 8) / 2 : this.yPosition;
         int var9 = var7;

         if (var3 > var4.length())
         {
             var3 = var4.length();
         }

         if (var4.length() > 0)
         {
             String var10 = var5 ? var4.substring(0, var2) : var4;
             var9 = this.fontRendererInstance.func_175063_a(var10, (float)var7, (float)var8, var1);
         }

         boolean var13 = this.cursorPosition < this.text.length() || this.text.length() >= this.getMaxStringLength();
         int var11 = var9;

         if (!var5)
         {
             var11 = var2 > 0 ? var7 + this.width : var7;
         }
         else if (var13)
         {
             var11 = var9 - 1;
             --var9;
         }

         if (var4.length() > 0 && var5 && var2 < var4.length())
         {
             var9 = this.fontRendererInstance.func_175063_a(var4.substring(var2), (float)var9, (float)var8, var1);
         }

         if (var6)
         {
             if (var13)
             {
                 Gui.drawRect(var11, var8 - 1, var11 + 1, var8 + 1 + this.fontRendererInstance.FONT_HEIGHT, -3092272);
             }
             else
             {
                 this.fontRendererInstance.func_175063_a("_", (float)var11, (float)var8, var1);
             }
         }

         if (var3 != var2)
         {
             int var12 = var7 + this.fontRendererInstance.getStringWidth(var4.substring(0, var3));
             this.drawCursorVertical(var11, var8 - 1, var12 - 1, var8 + 1 + this.fontRendererInstance.FONT_HEIGHT);
         }
     }
 }

 /**
  * draws the vertical line cursor in the textbox
  */
 private void drawCursorVertical(int p_146188_1_, int p_146188_2_, int p_146188_3_, int p_146188_4_)
 {
     int var5;

     if (p_146188_1_ < p_146188_3_)
     {
         var5 = p_146188_1_;
         p_146188_1_ = p_146188_3_;
         p_146188_3_ = var5;
     }

     if (p_146188_2_ < p_146188_4_)
     {
         var5 = p_146188_2_;
         p_146188_2_ = p_146188_4_;
         p_146188_4_ = var5;
     }

     if (p_146188_3_ > this.xPosition + this.width)
     {
         p_146188_3_ = this.xPosition + this.width;
     }

     if (p_146188_1_ > this.xPosition + this.width)
     {
         p_146188_1_ = this.xPosition + this.width;
     }

     Tessellator var7 = Tessellator.getInstance();
     WorldRenderer var6 = var7.getWorldRenderer();
     GlStateManager.color(0.0F, 0.0F, 255.0F, 255.0F);
     GlStateManager.func_179090_x();
     GlStateManager.enableColorLogic();
     GlStateManager.colorLogicOp(5387);
     var6.startDrawingQuads();
     var6.addVertex((double)p_146188_1_, (double)p_146188_4_, 0.0D);
     var6.addVertex((double)p_146188_3_, (double)p_146188_4_, 0.0D);
     var6.addVertex((double)p_146188_3_, (double)p_146188_2_, 0.0D);
     var6.addVertex((double)p_146188_1_, (double)p_146188_2_, 0.0D);
     var7.draw();
     GlStateManager.disableColorLogic();
     GlStateManager.func_179098_w();
 }

 public void setMaxStringLength(int p_146203_1_)
 {
     this.maxStringLength = p_146203_1_;

     if (this.text.length() > p_146203_1_)
     {
         this.text = this.text.substring(0, p_146203_1_);
     }
 }

 /**
  * returns the maximum number of character that can be contained in this textbox
  */
 public int getMaxStringLength()
 {
     return this.maxStringLength;
 }

 /**
  * returns the current position of the cursor
  */
 public int getCursorPosition()
 {
     return this.cursorPosition;
 }

 /**
  * get enable drawing background and outline
  */
 public boolean getEnableBackgroundDrawing()
 {
     return this.enableBackgroundDrawing;
 }

 /**
  * enable drawing background and outline
  */
 public void setEnableBackgroundDrawing(boolean p_146185_1_)
 {
     this.enableBackgroundDrawing = p_146185_1_;
 }

 /**
  * Sets the text colour for this textbox (disabled text will not use this colour)
  */
 public void setTextColor(int p_146193_1_)
 {
     this.enabledColor = p_146193_1_;
 }

 public void setDisabledTextColour(int p_146204_1_)
 {
     this.disabledColor = p_146204_1_;
 }

 /**
  * Sets focus to this gui element
  */
 public void setFocused(boolean p_146195_1_)
 {
     if (p_146195_1_ && !this.isFocused)
     {
         this.cursorCounter = 0;
     }

     this.isFocused = p_146195_1_;
 }

 /**
  * Getter for the focused field
  */
 public boolean isFocused()
 {
     return this.isFocused;
 }

 public void setEnabled(boolean p_146184_1_)
 {
     this.isEnabled = p_146184_1_;
 }

 /**
  * the side of the selection that is not the cursor, may be the same as the cursor
  */
 public int getSelectionEnd()
 {
     return this.selectionEnd;
 }

 /**
  * returns the width of the textbox depending on if background drawing is enabled
  */
 public int getWidth()
 {
     return this.getEnableBackgroundDrawing() ? this.width - 8 : this.width;
 }

 /**
  * Sets the position of the selection anchor (i.e. position the selection was started at)
  */
 public void setSelectionPos(int p_146199_1_)
 {
     int var2 = this.text.length();

     if (p_146199_1_ > var2)
     {
         p_146199_1_ = var2;
     }

     if (p_146199_1_ < 0)
     {
         p_146199_1_ = 0;
     }

     this.selectionEnd = p_146199_1_;

     if (this.fontRendererInstance != null)
     {
         if (this.lineScrollOffset > var2)
         {
             this.lineScrollOffset = var2;
         }

         int var3 = this.getWidth();
         String var4 = this.fontRendererInstance.trimStringToWidth(this.text.substring(this.lineScrollOffset), var3);
         int var5 = var4.length() + this.lineScrollOffset;

         if (p_146199_1_ == this.lineScrollOffset)
         {
             this.lineScrollOffset -= this.fontRendererInstance.trimStringToWidth(this.text, var3, true).length();
         }

         if (p_146199_1_ > var5)
         {
             this.lineScrollOffset += p_146199_1_ - var5;
         }
         else if (p_146199_1_ <= this.lineScrollOffset)
         {
             this.lineScrollOffset -= this.lineScrollOffset - p_146199_1_;
         }

         this.lineScrollOffset = MathHelper.clamp_int(this.lineScrollOffset, 0, var2);
     }
 }

 /**
  * if true the textbox can lose focus by clicking elsewhere on the screen
  */
 public void setCanLoseFocus(boolean p_146205_1_)
 {
     this.canLoseFocus = p_146205_1_;
 }

 /**
  * returns true if this textbox is visible
  */
 public boolean getVisible()
 {
     return this.visible;
 }

 /**
  * Sets whether or not this textbox is visible
  */
 public void setVisible(boolean p_146189_1_)
 {
     this.visible = p_146189_1_;
 }
}